_base.py 1013 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. from __future__ import absolute_import, division, unicode_literals
  2. try:
  3. from collections.abc import Mapping
  4. except ImportError: # Python 2.7
  5. from collections import Mapping
  6. class Trie(Mapping):
  7. """Abstract base class for tries"""
  8. def keys(self, prefix=None):
  9. # pylint:disable=arguments-differ
  10. keys = super(Trie, self).keys()
  11. if prefix is None:
  12. return set(keys)
  13. return {x for x in keys if x.startswith(prefix)}
  14. def has_keys_with_prefix(self, prefix):
  15. for key in self.keys():
  16. if key.startswith(prefix):
  17. return True
  18. return False
  19. def longest_prefix(self, prefix):
  20. if prefix in self:
  21. return prefix
  22. for i in range(1, len(prefix) + 1):
  23. if prefix[:-i] in self:
  24. return prefix[:-i]
  25. raise KeyError(prefix)
  26. def longest_prefix_item(self, prefix):
  27. lprefix = self.longest_prefix(prefix)
  28. return (lprefix, self[lprefix])